#pragma once

#include <iostream>
#include <string>

namespace LuaGui {
	class Logger {
	public:
		static Logger* GetSingleton() {
			static Logger s_logger;
			return &s_logger;
		}
		virtual void Debug(std::string msg) {
		}
		virtual void Info(std::string msg) {
		}
		virtual void Warn(std::string msg) {
		}
		virtual void Error(std::string msg) {
		}
	};

	class ConsoleLogger : public Logger {
	public:
		static Logger* GetSingleton() {
			static ConsoleLogger s_logger;
			return &s_logger;
		}
		virtual void Debug(std::string msg) {
			std::cout << "[DEBUG]" << msg << std::endl;
		}
		virtual void Info(std::string msg) {
			std::cout << "[INFO]" << msg << std::endl;
		}
		virtual void Warn(std::string msg) {
			std::cout << "[WARN]" << msg << std::endl;
		}
		virtual void Error(std::string msg) {
			std::cout << "[ERROR]" << msg << std::endl;
		}
	};

#if defined(ANDROID) || defined(__android) || defined(__android__)
#include <android/log.h>
#define LOG_TAG    "native-log"
	class AndroidLogger : public Logger {
	public:
		static Logger* GetSingleton() {
			static AndroidLogger s_logger;
			return &s_logger;
		}
		virtual void Debug(std::string msg) {
			__android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, "%s", msg.c_str());
		}
		virtual void Info(std::string msg) {
			__android_log_print(ANDROID_LOG_INFO, LOG_TAG, "%s", msg.c_str());
		}
		virtual void Warn(std::string msg) {
			__android_log_print(ANDROID_LOG_WARN, LOG_TAG, "%s", msg.c_str());
		}
		virtual void Error(std::string msg) {
			__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, "%s", msg.c_str());
		}
	};
#endif
}


